import axios from 'axios'

// import qs from 'qs'
import Message from 'vue-m-message'
import type { RequestConfig } from './modules/types/axios'
import useUserStore from '@/store/modules/user'

const api = axios.create({
  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
  timeout: 1000 * 60,
  responseType: 'json',
})

api.interceptors.request.use(
  (request) => {
    // 全局拦截请求发送前提交的参数
    const userStore = useUserStore()
    // 设置请求头
    if (request.headers) {
      if (userStore.isLogin) {
        request.headers.Token = userStore.token
      }
    }
    // 是否将 POST 请求参数进行字符串化处理
    if (request.method === 'post') {
      // request.data = qs.stringify(request.data, {
      //   arrayFormat: 'brackets',
      // })
    }
    return request
  },
)

api.interceptors.response.use(
  (response) => {
    /**
     * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
     * 假设返回数据格式为：{ status: 1, error: '', data: '' }
     * 规则是当 status 为 1 时表示请求成功，为 0 时表示接口需要登录或者登录状态失效，需要重新登录
     * 请求出错时 error 会返回错误信息
     */
    if (response.status !== 200) {
      if (response.status === 401) {
        useUserStore().logout()
      }
      else if (response.data !== '') {
        // 错误提示
        Message.error(response.data, {
          zIndex: 10000,
          duration: -1,
          closable: true,
        })
        return Promise.reject(response)
      }
    }
    return Promise.resolve(response)
  },
  (error) => {
    let message = error.message
    if (message === 'Network Error') {
      message = '后端网络故障'
    }
    else if (message.includes('timeout')) {
      message = '接口请求超时'
    }
    else if (message.includes('Request failed with status code')) {
      message = `接口${message.substr(message.length - 3)}异常`
    }
    const errMessage = error.response.data || message
    Message.error(errMessage, {
      zIndex: 10000,
      duration: -1,
      closable: true,
    })
    return Promise.reject(error)
  },
)

/* 封装实例的请求方法 */
export default async function request<T>(config: RequestConfig) {
  // axios实例的 request 接受的第一个泛型参数，就是返回数据data的类型
  return api.request<T>(config).then(res => res.data) // 返回axios的里data数据
}
export async function requestAllBack(config: RequestConfig) {
  // axios实例的 request 接受的第一个泛型参数，就是返回数据data的类型
  return api.request<any>(config).then(res => res) // 返回axios的里data数据
}
